//
//  Color.swift
//  MagaCore
//
//  Created by MrMessy on 2023/4/29.
//

import SwiftUI

extension Color {
  init(hex var_string: String) {
    var var_string: String = var_string.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines)
    if var_string.hasPrefix("#") {
      _ = var_string.removeFirst()
    }

    // Double the last value if incomplete hex
    if !var_string.count.isMultiple(of: 2), let last = var_string.last {
      var_string.append(last)
    }

    // Fix invalid values
    if var_string.count > 8 {
      var_string = String(var_string.prefix(8))
    }

    // Scanner creation
    let var_scanner = Scanner(string: var_string)

    var var_color: UInt64 = 0
    var_scanner.scanHexInt64(&var_color)

    if var_string.count == 2 {
      let var_mask = 0xFF

      let var_g = Int(var_color) & var_mask

      let var_gray = Double(var_g) / 255.0

      self.init(.sRGB, red: var_gray, green: var_gray, blue: var_gray, opacity: 1)

    } else if var_string.count == 4 {
      let var_mask = 0x00FF

      let var_g = Int(var_color >> 8) & var_mask
      let var_a = Int(var_color) & var_mask

      let var_gray = Double(var_g) / 255.0
      let var_alpha = Double(var_a) / 255.0

      self.init(.sRGB, red: var_gray, green: var_gray, blue: var_gray, opacity: var_alpha)

    } else if var_string.count == 6 {
      let var_mask = 0x0000FF
      let var_r = Int(var_color >> 16) & var_mask
      let var_g = Int(var_color >> 8) & var_mask
      let var_b = Int(var_color) & var_mask

      let var_red = Double(var_r) / 255.0
      let var_green = Double(var_g) / 255.0
      let var_blue = Double(var_b) / 255.0

      self.init(.sRGB, red: var_red, green: var_green, blue: var_blue, opacity: 1)

    } else if var_string.count == 8 {
      let var_mask = 0x000000FF
      let var_r = Int(var_color >> 24) & var_mask
      let var_g = Int(var_color >> 16) & var_mask
      let var_b = Int(var_color >> 8) & var_mask
      let var_a = Int(var_color) & var_mask

      let var_red = Double(var_r) / 255.0
      let var_green = Double(var_g) / 255.0
      let var_blue = Double(var_b) / 255.0
      let var_alpha = Double(var_a) / 255.0

      self.init(.sRGB, red: var_red, green: var_green, blue: var_blue, opacity: var_alpha)

    } else {
      self.init(.sRGB, red: 1, green: 1, blue: 1, opacity: 1)
    }
  }
}
